IAR环境下从CCM RAM执行程序的介绍
【温馨提示:文中图片可点击放大查看】
STM32家族中基于ARMCortex M4内核的STM32F3与STM32F4系列芯片内有一块特殊的SRAM存储区---内核耦合存储器[CCM RAM],为CPU所专享访问。主要是为了实现在最高系统时钟频率下执行代码,避免出现等待状态。因此,与从闪存里执行代码相比,大大节省了关键任务的执行时间。
CCM RAM一般用于实时性高或计算密集型程序,比如:
* 数字电源的控制环(开关电源,照明)
* 3相矢量电机控制
* 实时DSP任务
当程序代码位于CCM RAM而数据保存在常规SRAM时,M4内核便处于最优的哈佛结构配置,让指令零等待执行从而实现速度最大化。如果中断服务程序位于CCMRAM中,可以确保最短的时延,提高响应速度。
当然,CCM RAM不用来存放执行代码时,也可当做常规SRAM使用,不过它不能被DMA访问。另外,也不推荐在CCM中同时存放指令代码和数据,不然内核访问CCM里的数据和指令时可能会出现冲突,影响CPU的处理性能。【不过对于STM32F4,CCM只能用来存放数据,不能执行指令代码。具体查看比较两个系列的系统框架图】
下面主要介绍基于IAR开发环境如何从CCM RAM执行简单函数或中断服务程序的配置步骤或要点。
一、从CCMRAM 执行简单代码(中断处理程序除外)
简单代码可由一个或者多个非引用自中断处理程序的函数所组成。EWARM 可用于将一个/ 多个函数或整个源文件放入CCM RAM。该操作需要在链接器文件(.icf)中定义一个新区段,用于保存需存入CCMRAM 中的代码。该区段会在启动时复制到CCM RAM。以下是所需步骤:
1. 设定起始地址和结束地址,定义CCM RAM 地址区。
2. 通知链接器在启动时将.ccmram区段从闪存复制到CCM。
3. 提示链接器,代码段.ccmram应置入CCM RAM区域。
关于上述操作的配置,请参考下图1。
图1:EWARM 连接器更新配置
1.1 从CCM RAM 执行源文件
从CCM RAM执行源文件意味着该文件所声明的全部函数均从该内存区域中执行。如需放置与执行来自CCM RAM的源文件,使用EWARM文件选项窗口进行如下操作:
1. 在链接文件中添加如图1所示的 .ccmram 区段。
2. 右键点击项目窗口中的文件名。
3. 在出现的菜单上选择选项。
4. 勾选窗口中的覆盖继承设定
5. 选择输出选项,在代码段名称输入链接器文件中设定的区段名(本例为“.ccmram”)。
图2 EWARM文件的放置
1.2 从CCM RAM 执行一个或多个函数
从CCM RAM 执行函数的步骤如下:
1. 在链接器文件中添加如上所述的.ccmram 区段。
2. 使用关键字pragma location,指定需从CCM RAM执行的函数。参见下图3操作。
图3: EWARM 函数的放置
注: 为从CCM RAM执行多个函数,应在各个函数声明上方设置pragma location关键字。
二、从CCM RAM 执行中断处理程序
向量表以名为__vector_table 的数组来实现,且在启动代码中被引用。EWARM链接器保护从启动代码中引用的区段,以免受到“复制初始化”指令的影响。因此,不应使用__vector_table符号通过“ 复制初始化” 指令来复制中断处理程序区段。为此,应制作第二个向量表,并将其放入CCM RAM。从CCM RAM 执行中断处理程序的步骤如下:
1. 更新链接器文件(.icf)。
2. 更新启动文件。
3. 将中断处理程序放入CCM RAM。
4. 将向量表重新映射至CCM RAM。
2.1 更新链接器文件(.icf)
链接器文件更新步骤:
1. 定义第二个向量表所在的地址:0x1000 0000。
2. 指定起始地址和结束地址,定义CCM RAM 内存地址区。
3. 向链接器指明,在启动时将名为.ccmram 的区段和第二个向量表区段
“.intvec_CCMRAM” 从闪存复制到CCM RAM。
4. 向链接器指明,第二个向量表应放在intvec_CCMRAM 区段内。
5. 指明.ccmram代码段将放在CCM RAM 中。
图4:适用于中断处理程序的EWARM 链接器更新
2.2 更新启动文件
启动文件修改步骤:
1. 制作第二个将保存在CCM RAM中的向量表。删除原始向量“__vector_table” 中除sfe(CSTACK)和Reset_Handler 之外的所有条目。
2. 添加将放入CCMRAM 中的第二个向量表。表中应包含所有条目,比如命名它为
“__vector_table_CCMRAM”。该向量表必须放在链接器文件所定义的intvec_CCMRAM区段中。
图5. 适用于中断处理程序的EWARM启动文件更新
2.3 将中断处理程序放入CCM RAM
参照上面1.2 章节所述把需执行的中断处理函数或参照上面1.1 章节中所述将整个stm32f_it.c 文件放入CCM RAM区。
2.4 将向量表重新映射至CCM RAM
在SystemInit 函数中,按以下方式修改VTOR 寄存器,将向量表重新映射至CCM RAM:
SCB->VTOR = 0x10000000 | VECT_TAB_OFFSET;
2.5 从CCM RAM 执行库(.a)
EWARM允许从CCM RAM 执行库或库模块。使用库模块名称按照如下3步进行操作。
2.5.1. 通过指定起始地址和结束地址,定义对应于CCM RAM 的内存地址区。
图6. CCM RAM 区域定义
2.5.2. 更新链接器,在启动时利用“initialize bycopy” 将库或库模块复制至CCM RAM。
图7. EWARM 区段初始化
2.5.3. 向链接器指明,库应放入CCM RAM。
图8. EWARM 库的放置
下面例子显示了如何将arm_abs_f32.o(iar_cortexM4l_math.a库中的一个模块)放入CCM RAM的配置。
图 9. EWARM 库模块运行于CCM的配置
小结:上面主要介绍了基于IAR编译器条件下,如何将代码放入指定存储区CCM的配置和使用方法。其实,STM32F4/STM32F7等高端系列的RAM存储区有了更多的划分,如何合理使用和利用各存储区有时也会需要做相关的配置,我们从上面的介绍可以得到启发并加以灵活运用。
另外,ST官方有个应用笔记AN4296针对上面内容就不同编译环境做了全面的介绍,有兴趣的可去www.st.com/stm32搜索下载之,或点击左下方“阅读原文”去中文网www.stmcu.com.cn下载。
=============================
往期话题链接:
5、
扫描或长按二维码可关注公众号